<?php
// $Id$

/**
 * Goods 封装来自 cmsp_goods 数据表的记录及领域逻辑
 */
class Goods extends QDB_ActiveRecord_Abstract
{

    /**
     * 返回对象的定义
     *
     * @static
     *
     * @return array
     */
    static function __define()
    {
        return array
        (
            // 指定该 ActiveRecord 要使用的行为插件
            'behaviors' => '',

            // 指定行为插件的配置
            'behaviors_settings' => array
            (
                # '插件名' => array('选项' => 设置),
            ),

            // 用什么数据表保存对象
            'table_name' => 'cmsp_goods',

            // 指定数据表记录字段与对象属性之间的映射关系
            // 没有在此处指定的属性，QeePHP 会自动设置将属性映射为对象的可读写属性
            'props' => array
            (
                // 主键应该是只读，确保领域对象的“不变量”
                'goods_id' => array('readonly' => true),

                // 对象创建时间应该是只读
                'created' => array('readonly' => true),


                /**
                 *  可以在此添加其他属性的设置
                 */
                # 'other_prop' => array('readonly' => true),

                /**
                 * 添加对象间的关联
                 */
                # 'other' => array('has_one' => 'Class'),
                'tags' => array(QDB::MANY_TO_MANY => 'Taggoods','mid_table_name'=>'cmsp_taggoods_join', 'mid_source_key'=>'goods_id','mid_target_key'=>'tag_id','mid_common_key'=>'store_id','skip_empty'=>true),
                'store'=> array(QDB::BELONGS_TO=>'Stores','source_key'=>'store_id','target_key'=>'store_id','skip_empty'=>true),
                'langdesc'=> array(QDB::HAS_MANY=>'Goods_Desc','source_key'=>'goods_id','target_key'=>'goods_id','skip_empty'=>true),
                'tag_ids'=>array('getter'=>'gettag_ids'),
                'title'=>array('getter'=>'gettitle'),
                'desc'=>array('getter'=>'getdesc'),
                'props'=>array('getter'=>'getprops'),
                'introduction'=>array('getter'=>'getintroduction'),
            ),

            /**
             * 允许使用 mass-assignment 方式赋值的属性
             *
             * 如果指定了 attr_accessible，则忽略 attr_protected 的设置。
             */
            'attr_accessible' => '',

            /**
             * 拒绝使用 mass-assignment 方式赋值的属性
             */
            'attr_protected' => 'goods_id',

            /**
             * 指定在数据库中创建对象时，哪些属性的值不允许由外部提供
             *
             * 这里指定的属性会在创建记录时被过滤掉，从而让数据库自行填充值。
             */
            'create_reject' => '',

            /**
             * 指定更新数据库中的对象时，哪些属性的值不允许由外部提供
             */
            'update_reject' => '',

            /**
             * 指定在数据库中创建对象时，哪些属性的值由下面指定的内容进行覆盖
             *
             * 如果填充值为 self::AUTOFILL_TIMESTAMP 或 self::AUTOFILL_DATETIME，
             * 则会根据属性的类型来自动填充当前时间（整数或字符串）。
             *
             * 如果填充值为一个数组，则假定为 callback 方法。
             */
            'create_autofill' => array
            (
                # 属性名 => 填充值
                # 'is_locked' => 0,
                'created' => self::AUTOFILL_TIMESTAMP ,
            ),

            /**
             * 指定更新数据库中的对象时，哪些属性的值由下面指定的内容进行覆盖
             *
             * 填充值的指定规则同 create_autofill
             */
            'update_autofill' => array
            (
            ),

            /**
             * 在保存对象时，会按照下面指定的验证规则进行验证。验证失败会抛出异常。
             *
             * 除了在保存时自动验证，还可以通过对象的 ::meta()->validate() 方法对数组数据进行验证。
             *
             * 如果需要添加一个自定义验证，应该写成
             *
             * 'title' => array(
             *        array(array(__CLASS__, 'checkTitle'), '标题不能为空'),
             * )
             *
             * 然后在该类中添加 checkTitle() 方法。函数原型如下：
             *
             * static function checkTitle($title)
             *
             * 该方法返回 true 表示通过验证。
             */
            'validations' => array
            (
                'store_id' => array
                (
                    array('is_int', 'store_id必须是一个整数'),

                ),

                'seller_id' => array
                (
                    array('is_int', 'seller_id必须是一个整数'),

                ),
            ),
        );
    }


/* ------------------ 以下是自动生成的代码，不能修改 ------------------ */

    /**
     * 开启一个查询，查找符合条件的对象或对象集合
     *
     * @static
     *
     * @return QDB_Select
     */
    static function find()
    {
        $args = func_get_args();
        return QDB_ActiveRecord_Meta::instance(__CLASS__)->findByArgs($args);
    }

    /**
     * 返回当前 ActiveRecord 类的元数据对象
     *
     * @static
     *
     * @return QDB_ActiveRecord_Meta
     */
    static function meta()
    {
        return QDB_ActiveRecord_Meta::instance(__CLASS__);
    }


/* ------------------ 以上是自动生成的代码，不能修改 ------------------ */
//     /***
//      * 添加 Tag 
//      * @$tag  tag 对象     
//      */
//     public function addTag($tag){
//         if(!empty($tag->tag_id)&&!in_array($tag->tag_id,$this->tag_ids)
//             &&$tag->store==$this->store){
//             $this->tags[]=$tag;
//             $r=$this->save(1,'update');
//         }
//         return $this;
//     }
//     /***
//      * 添加 Tag 
//      * @$tag  tag 对象     
//      */
//     public function updateTags($tags){
//         $new_tag_ids=array();
//         if(count($tags)) foreach($tags as $tag){
//           if($tag->tag_id&&$tag->store_id==$this->store_id){
//               if(!in_array($tag->tag_id,$this->tag_ids)){
//                 $t=new Taggoods_Join;
//                 $t->changeProps(array(
//                     'store_id'=>$this->store_id,
//                     'goods_id'=>$this->goods_id,
//                     'tag_id'=>$tag->tag_id
//                 ));
//                 $t->save();
//               }
//           }
//           $new_tag_ids[]=$tag->tag_id;
//         }
//         var_dump($new_tag_ids);
//         //删除 
//         $rm_tag_ids=array_diff($this->tag_ids,$new_tag_ids);
//         if(count($rm_tag_ids)){
//             Taggoods_Join::meta()->deleteWhere('goods_id =? And tag_id in(?)',$this->goods_id,$rm_tag_ids);
//         }
//         var_dump($rm_tag_ids);
//         die();
//         return $this;
//     }
//     /**
//      * Tag 是否已经存在
//      */
//     protected function gettags ()
//     {
//         Taggoods::meta()->assoc('tags')->on_find_where='';
//         
//         Taggoods::find()
//             ->join(array('j'=>Taggoods_Join::meta()->table),'',)->getAll();
//         Taggoods_Join::find('store_id =? And goods_id=?',$this->store_id,$this->goods_id)
//         
//         return ;
//     }
    /**
     * Tag 是否已经存在
     */
    protected function gettag_ids (){
        return Helper_Array::getCols($this->tags,'tag_id');
    }
    
    protected function gettitle(){
        if($gd=$this->getGoodDesc()){
            return $gd['title'];
        }else{
            return '';
        }
    }
    protected function getdesc (){
        if($gd=$this->getGoodDesc()){
            return $gd['desc'];
        }else{
            return '';
        }
    }
    protected function getprops (){
        if($gd=$this->getGoodDesc()){
            return $gd['property'];
        }else{
            return '';
        }
    }
    protected function getintroduction(){
        if($gd=$this->getGoodDesc()){
            return $gd['introduction'];
        }else{
            return '';
        }
    }
    protected function getGoodDesc(){
        if(strlen(Q::ini('store/language'))<=0){
            return false;
        }
        if(strlen(Q::ini('language'))){
            $language=Q::ini('language');
        }else{
            $language=Q::ini('store/language');
        }
        return Goods_Desc::bylanguage($this->_props['goods_id'],$language);
    }
    
    /**
     * 解晰 属性 
     *  csv 中的属性 格式为  
     *  propName:value1+price|value2+price;... 
     *  属性  数组:
     *  array(
     *     'name'=>propName,
     *      values=>(
     *          value
     *          )
     *      price=>(
     *        
     *          )     
     *     )
     */
     static function parseprops($propstr){
        $return_props=array();
        $j=0;
        foreach(explode(';',$propstr) as $propstr){
            $j++;
            $i=preg_match('/(\w+)[:](.*)/',$propstr,$m);
            if(!$i) continue 1;
            $prop=array(
                'name'=>$m[1],
            );
            $propvaluestr=$m[2];
            
            $propvalues=explode('|',$propvaluestr);
            $k=0;
            foreach($propvalues as $propvaluestr){
                $k++;
                $i=preg_match('/(\w+)([+|-][.0-9]+)?/',$propvaluestr,$m);
                if(!$i) continue 1;
                $prop['values'][]=$m[1];
                $prop['prices'][]=@$m[2];
            }
            $return_props[]=$prop;
        }
        return $return_props;
    }
    /***
     * 组合 属性 数组   到字符串  
     */         
    static function combinationprops($proparr){
        $propstr='';
        foreach($proparr as $prop){
            $propstr.=$prop['name'].':';
            foreach($prop['values'] as $k=>$o){
                if(isset($prop['prices'][$k])){
                    if(strlen($prop['prices'][$k])&&$prop['prices'][$k]>0){
                        $price='+'.$prop['prices'][$k];
                    }else{
                        $price='-'.$prop['prices'][$k];
                    }
                }
                $propstr.=$o.$price.'|';
            }
            $propstr=rtrim($propstr,'|');
            $propstr.=';';
        }
        return $propstr;
    }
    
}

